package teste.objetos;

import junit.framework.Assert;
import objetos.Sistema;

import org.junit.Before;
import org.junit.Test;

public class TestSistema {

	private Sistema sistema;
	private String idUsuarioUm, idUsuarioDois, idUsuarioTres;
	
	@Before
	public void setUp() throws Exception {
		sistema = Sistema.getInstance();
	}
	
	@Test
	public void verificaAbrirSessao() throws Exception{
		sistema.criarUsuario("LoginUm", "NomeUm", "EnderecoUm");
		sistema.criarUsuario("LoginDois", "NomeDois", "EnderecoDois");
		sistema.criarUsuario("LoginTres", "NomeTres", "EnderecoTres");
		this.idUsuarioUm = "" + this.sistema.abrirSessao("LoginUm");
		this.idUsuarioDois = "" + this.sistema.abrirSessao("LoginDois");
		this.idUsuarioTres = "" + this.sistema.abrirSessao("LoginTres");
		try{
			sistema.abrirSessao("");
			Assert.fail("Vai entrar em excecao por causa do Login vazio.");
		}
		catch(Exception e){
			Assert.assertEquals("Login vazio.", "Login inválido", e.getMessage());
		}
		
		try{
			sistema.abrirSessao(null);
			Assert.fail("Vai entrar em excecao por causa do Login nulo.");
		}
		catch(Exception e){
			Assert.assertEquals("Login nulo.", "Login inválido", e.getMessage());
		}
		
		try{
			sistema.abrirSessao("UsuarioInexistente");
			Assert.fail("Vai entrar em excecao pelo usuario inexistente.");
		}
		catch(Exception e){
			Assert.assertEquals("Usuario inexistente!", "Usuário inexistente", e.getMessage());
		}
		
		this.sistema.verificarSessao(this.idUsuarioUm);
		this.sistema.verificarSessao(this.idUsuarioDois);
		this.sistema.verificarSessao(this.idUsuarioTres);
		Assert.assertEquals("NomeUm", this.sistema.retornaUsuarioPeloLogin("LoginUm").getNome());
		Assert.assertEquals("NomeDois", this.sistema.retornaUsuarioPeloLogin("LoginDois").getNome());
		Assert.assertEquals("NomeTres", this.sistema.retornaUsuarioPeloLogin("LoginTres").getNome());
	}
	
	@Test
	public void verificaCadastraItem() throws Exception{
		this.idUsuarioUm = "" + this.sistema.abrirSessao("LoginUm");
		this.idUsuarioDois = "" + this.sistema.abrirSessao("LoginDois");
		this.idUsuarioTres = "" + this.sistema.abrirSessao("LoginTres");
		String idItemUm = "" + this.sistema.cadastrarItem(this.idUsuarioUm, "ItemUm", "DescricaoUm", "Filme");
		String idItemDois = "" + this.sistema.cadastrarItem(this.idUsuarioDois, "ItemDois", "DescricaoDois", "Livro");
		String idItemTres = "" + this.sistema.cadastrarItem(this.idUsuarioTres, "ItemTres", "DescricaoTres", "Jogo");
		this.sistema.verificarIdItem(idItemUm);
		this.sistema.verificarIdItem(idItemDois);
		this.sistema.verificarIdItem(idItemTres);
		Assert.assertEquals("ItemUm", this.sistema.retornaItemPeloId(Integer.parseInt(idItemUm)).getNome());
		Assert.assertEquals("ItemDois", this.sistema.retornaItemPeloId(Integer.parseInt(idItemDois)).getNome());
		Assert.assertEquals("ItemTres", this.sistema.retornaItemPeloId(Integer.parseInt(idItemTres)).getNome());
	}
	
	@Test
	public void verificaGetAtributoUsuario() throws Exception{
		Assert.assertEquals("NomeUm", this.sistema.getAtributoUsuario("LoginUm", "nome"));
		Assert.assertEquals("NomeDois", this.sistema.getAtributoUsuario("LoginDois", "nome"));
		Assert.assertEquals("NomeTres", this.sistema.getAtributoUsuario("LoginTres", "nome"));
		Assert.assertEquals("EnderecoUm", this.sistema.getAtributoUsuario("LoginUm", "endereco"));
		Assert.assertEquals("EnderecoDois", this.sistema.getAtributoUsuario("LoginDois", "endereco"));
		Assert.assertEquals("EnderecoTres", this.sistema.getAtributoUsuario("LoginTres", "endereco"));
		try{
			this.sistema.getAtributoUsuario("", "nome");
			Assert.fail("Vai entrar em excecao, por login vazio.");
		}
		catch(Exception e){
			Assert.assertEquals("Login vazio.", "Login inválido", e.getMessage());
		}
		
		try{
			this.sistema.getAtributoUsuario(null, "nome");
			Assert.fail("Vai entrar em excecao, por login nulo.");
		}
		catch(Exception e){
			Assert.assertEquals("Login nulo.", "Login inválido", e.getMessage());
		}
		
		try{
			this.sistema.getAtributoUsuario("LoginUm", "");
			Assert.fail("Vai entrar em excecao, por atributo vazio.");
		}
		catch(Exception e){
			Assert.assertEquals("Atributo vazio.", "Atributo inválido", e.getMessage());
		}
		
		try{
			this.sistema.getAtributoUsuario("LoginUm", null);
			Assert.fail("Vai entrar em excecao, por atributo nulo.");
		}
		catch(Exception e){
			Assert.assertEquals("Atributo nulo.", "Atributo inválido", e.getMessage());
		}
		
		try{
			this.sistema.getAtributoUsuario("LoginUm", "AtributoInexistente");
			Assert.fail("Vai entrar em excecao, por atributo inexistente.");
		}
		catch(Exception e){
			Assert.assertEquals("Atributo inexistente.", "Atributo inexistente", e.getMessage());
		}
	}
	
	@Test
	public void verificaGetAtributoItem() throws Exception{
		this.idUsuarioUm = "" + this.sistema.abrirSessao("LoginUm");
		this.idUsuarioDois = "" + this.sistema.abrirSessao("LoginDois");
		this.idUsuarioTres = "" + this.sistema.abrirSessao("LoginTres");
		String idItemUm = "" + this.sistema.cadastrarItem(this.idUsuarioUm, "ItemUm", "DescricaoUm", "Filme");
		String idItemDois = "" + this.sistema.cadastrarItem(this.idUsuarioDois, "ItemDois", "DescricaoDois", "Livro");
		String idItemTres = "" + this.sistema.cadastrarItem(this.idUsuarioTres, "ItemTres", "DescricaoTres", "Jogo");
		
		try{
			this.sistema.getAtributoItem("", "nome");
			Assert.fail("Vai entrar em excecao, por id vazio.");
		}
		catch(Exception e){
			Assert.assertEquals("Id vazio.", "Identificador do item é inválido", e.getMessage());
		}
		
		try{
			this.sistema.getAtributoItem(null, "nome");
			Assert.fail("Vai entrar em excecao, por id nulo.");
		}
		catch(Exception e){
			Assert.assertEquals("Id nulo.", "Identificador do item é inválido", e.getMessage());
		}
		
		try{
			this.sistema.getAtributoItem("idUm", "");
			Assert.fail("Vai entrar em excecao, por atributo vazio.");
		}
		catch(Exception e){
			Assert.assertEquals("Atributo vazio.", "Atributo inválido", e.getMessage());
		}
		
		try{
			this.sistema.getAtributoItem("idUm", null);
			Assert.fail("Vai entrar em excecao, por atributo nulo.");
		}
		catch(Exception e){
			Assert.assertEquals("Atributo nulo.", "Atributo inválido", e.getMessage());
		}
		
		try{
			this.sistema.getAtributoItem("IdInexistente", "nome");
			Assert.fail("Vai entrar em excecao, por id inexistente.");
		}
		catch(Exception e){
			Assert.assertEquals("Id inexistente.", "Item inexistente", e.getMessage());
		}
		
		Assert.assertEquals("ItemUm", this.sistema.getAtributoItem(idItemUm, "nome"));
		Assert.assertEquals("ItemDois", this.sistema.getAtributoItem(idItemDois, "nome"));
		Assert.assertEquals("ItemTres", this.sistema.getAtributoItem(idItemTres, "nome"));
		Assert.assertEquals("DescricaoUm", this.sistema.getAtributoItem(idItemUm, "descricao"));
		Assert.assertEquals("DescricaoDois", this.sistema.getAtributoItem(idItemDois, "descricao"));
		Assert.assertEquals("DescricaoTres", this.sistema.getAtributoItem(idItemTres, "descricao"));
		Assert.assertEquals("Filme", this.sistema.getAtributoItem(idItemUm, "categoria"));
		Assert.assertEquals("Livro", this.sistema.getAtributoItem(idItemDois, "categoria"));
		Assert.assertEquals("Jogo", this.sistema.getAtributoItem(idItemTres, "categoria"));
	}
	
	

}
